package com.zzq.my.jetpacks.net.rxhttp

import okhttp3.Response
import rxhttp.wrapper.annotation.Parser
import rxhttp.wrapper.exception.ParseException
import rxhttp.wrapper.parse.TypeParser
import rxhttp.wrapper.utils.convertTo
import java.io.IOException
import java.lang.reflect.Type





/**
 * 描述：自定义解析器
 * 作者：zhuangzeqin
 * 时间: 2022/1/25-15:18
 * 邮箱：zzq@eeepay.cn
 * 备注:
 */
@Parser(name = "Response", wrappers = [List::class])
open class ResponseParser<T> : TypeParser<T> {
    //以下两个构造方法是必须的
    protected constructor() : super()
    constructor(type: Type) : super(type)

    @Throws(IOException::class)
    override fun onParse(response: Response): T {
        val data: BaseResponse<T> = response.convertTo(BaseResponse::class, *types)
        var t = data.data     //获取data字段
//        if (HttpURLConnection.HTTP_UNAUTHORIZED == data.code) {//401
//            // 标识码 401 被登录拦截了下来了
//            RxHttpPlugins.cancelAll()////取消所有的请求
////            RxHttp.get().dispatcher().cancelAll()
//            Log.d("ResultCallBackParse", "<----401 被登录拦截了下来了,需要调转到登录页面---->")
////            AppBus.getInstance().post(AppEvent(code, "401 token 失效")) //发布事件，在主界面进行订阅
//            throw ParseException(data.code.toString(), data.message, response)
//        }else
//        {
            if (data.code != 200 && !data.success) { //code不等于200，说明数据不正确，抛出异常
                throw ParseException(data.code.toString(), data.message, response)
            }
            //{"code":200,"message":"","data":null,"count":0,"success":true}
            if (t == null && types[0] === String::class.java) {
//            *//*
//            * 考虑到有些时候服务端会返回：{"errorCode":0,"errorMsg":"关注成功"}  类似没有data的数据
//            * 此时code正确，但是data字段为空，直接返回data的话，会报空指针错误，
//            * 所以，判断泛型为String类型时，重新赋值，并确保赋值不为null
//            *//*
                @Suppress("UNCHECKED_CAST")
                t = "" as T
            }
//        }
        return t!!  //最后返回data字段
    }
}